#ifndef FILEAPPENDER_H
#define FILEAPPENDER_H

#include <QDateTime>
#include <QMutex>
#include <QFile>
#include <QCoreApplication>
#include "baseappender.h"


//输出内容到文件
//1.设置文件分割策略
//2.文件分割按大小时的阈值
//3.文件分割按行数时的阈值
//4.文件分割按时间时的阈值
//5.文件强制刷新的等级
//6.文件缓存大小
//7.文件输出路径和基础名
//8.最多保存文件数



class FileAppender : public BaseAppender
{
    Q_OBJECT
public:

    FileAppender(LogLevel level,const QString& logPath = "");// 构造函数：默认初始化核心参数
    ~FileAppender();// 析构函数：释放资源+刷新缓存

    // -------------------------- 核心功能：设置分割策略 --------------------------
    void setSplitMode(SplitMode mode) { m_splitMode = mode; }
    void setSplitSize(qint64 size) { m_splitMode = SplitMode::Size; m_splitSize = size; }
    void setSplitLines(int lines) { m_splitMode = SplitMode::Line; m_splitLines = lines; }
    void setTimeSplitUnit(TimeUnit unit) { m_splitMode = SplitMode::Time; m_timeUnit = unit; }

    // -------------------------- 核心功能：设置文件参数 --------------------------
    void setForceFlushLevel(LogLevel level) { m_forceFlushLevel = level; }// 设置强制刷新等级（达到该等级立即刷缓存到文件）
    void setCacheSize(int size) { m_cacheSize = size; }// 设置缓存大小（字节）
    void setLogPathAndBaseName(const QString& path, const QString& baseName="app");// 设置日志路径+基础名（修改后需重建文件）
    void setMaxFileCount(int count);// 设置最多保存文件数（设置后立即清理旧文件）

    // -------------------------- 重写核心：日志写入逻辑 --------------------------
    void append(LogLevel level, const QString& msg) override;

private:
    // -------------------------- 辅助函数：目录/文件初始化 --------------------------
    void createLogDir();// 创建日志目录（不存在则创建）
    void createNewLogFile();// 创建新的日志文件（当前文件为：基础名.log）
    void closeCurrentFile();// 关闭当前日志文件

    // -------------------------- 辅助函数：文件分割逻辑 --------------------------
    bool checkNeedSplit();// 检查是否需要分割文件（根据当前分割模式）
    bool isTimeOverThreshold();// 时间分割判断：是否超过当前时间单位（如Day=跨天、Hour=跨小时）
    void splitLogFile();// 执行文件分割：重命名当前文件+创建新文件+清理旧文件
    void cleanOldFiles();// 清理旧文件：保留最新的N个文件（N=maxFileCount）

    // -------------------------- 辅助函数：缓存与刷新 --------------------------
    void flushCache();// 刷新缓存：将缓存内容写入文件+更新文件大小/行数
    int countFileLines(const QString& filePath);// 统计文件的总行数（用于初始化已有文件的行数）
private:
    // 分割相关参数
    SplitMode m_splitMode=SplitMode::Size;      // 分割模式（大小/行数/时间）
    qint64 m_splitSize=1024*1024*10;            // 大小分割阈值（字节）
    int m_splitLines=10000;                     // 行数分割阈值
    TimeUnit m_timeUnit=TimeUnit::Day;          // 时间分割单位（小时/天/周/月）

    // 缓存与刷新相关参数
    LogLevel m_forceFlushLevel=LogLevel::Error; // 强制刷新的日志等级
    int m_cacheSize=4096;                       // 缓存大小（字节）
    QByteArray m_cache;                         // 缓存区

    // 文件路径与命名相关参数
    QString m_logPath="";                 // 日志文件路径
    QString m_baseName="app";                   // 日志文件基础名（如"appLog"）
    int m_maxFileCount=10;                      // 最多保存文件数

    // 当前文件状态参数
    QFile* m_logFile;                           // 当前日志文件对象
    QTextStream* m_textStream;                  // 当前文件文本流
    int m_currentLines;                         // 当前文件已写行数
    qint64 m_currentFileSize;                   // 当前文件已写大小（字节）
    QDateTime m_fileCreateTime;                 // 当前文件创建时间（用于时间分割）

    QMutex m_mutex;                             // 线程安全锁（避免多线程写冲突）
};

#endif // FILEAPPENDER_H
